Spring数据库编程及事务管理
撰写时间: 2020-01-15 总共: 2405 字 转载请注明: BY-SA 4.0(除特别声明或转载文章外)
Spring 数据库编程
数据库编程是互联网编程的基础。
Spring提供了JDBC模版模式:jdbcTemplates。Spring虽然自带JDBC,但是开发当中往往使用Hibernate和MyBatis。
Spring JDBC模块使用需要进行dataSource进行相关配置。
<beans>
<!--配置数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriveManger-DataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--配置JDBC模版-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
使用时,可直接依赖注入然后进行jdbcTemplate的使用。
常用方法:
- update
- query
@Repository
public TestDaoImpl implements testDao{
@Autowired
private JdbcTemplate jdbcTemplate;
public void funtion(){
String sql = "sql语句 以 ? 进行参数指定";
Object param[] = {};
// 增加,修改,删除
jdbcTemplate.update(sql,param);
// 查询
RowMapper<T> rowMapper = new BeanPropertyRowMapper<T>(T.class);
jdbcTemplate.query(sql,rowMapper,param);
}
}
Spring 事务管理
编程式事务管理
在代码当中 显 式 的 使用beginTransaction、commit、rollback、等与事务相关的方法。
- 基于底层API的编程式事务管理
- 基于TransactionTemplate的编程式事务管理
都要进行事务管理器的配置等等,了解一下。
声明式事务管理
编程式事务管理往大了的说不适合在多数的事务管理中使用,存在大量的代码冗余。Spring声明式事务管理主要是利用AOP进行实现。
本质上是在方法前后进拦截,开始前进行事务开启,根据执行情况 进行事务执行提交或回滚。
优点在于:无需像编程式事务管理那样在业务逻辑中掺杂事务管理的代码,业务代码不被污染,方便后期维护。
缺点就是事务的控制粒度只能到达方法级,不能像编程式那种达到代码块级别。
Spring 声明式事务管理:
- 基于XML
- 基于注解@Transactionall
XML配置
<!--指定要扫描的包-->
...
<!--配置数据源-->
...
<!--配置JDBC模版-->
...
<!--配置事务管理器-->
<bean id="txManger" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置通知声明事务-->
<tx:adivce id="myAdivce" transaction-manger="txManger">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:adivce>
<!--配置AOP-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution()"/>
<aop:advisor advice-ref="myAdivce" pointcut-ref="txPointCut"/>
</aop:config>
基于注解的方式,@Transactional 可以作用与接口、接口方法、类、类方法。
作用于类上时,该类的public方法都将具有该类型的事务,不建议在接口和接口方法上进行注解使用,因为该注解只有使用基于接口的代理时会生效。
当不想在某个异常下事务处理时
// 不对RuntimeException回滚生效
@Transactional(rollbackFor=RuntimeException.class)
// 所有Exception
@Transactional(rollbackFor=Exception.class)
同时需要在xml配置中进行事务注解的支持
...
<!--配置事务管理器-->
...
<!--开启事务管理器注解-->
<tx:annotation-driven transaction-manger="txManger" />